home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Compilers⁄Interps / kevoSource / signals.c < prev    next >
Text File  |  1993-05-13  |  3KB  |  110 lines

  1. /* Kevo -- a prototype-based object-oriented language */
  2. /* (c) Antero Taivalsaari 1991-1993                   */
  3. /* Some parts (c) Antero Taivalsaari 1986-1988           */
  4. /* signals.c: Signal and exception handling           */
  5.  
  6. #include "global.h"
  7. #include "portGlobal.h"
  8.  
  9. /* ---------------------------------------------------------------------------- */
  10. /* Keyboard interrupt */
  11.  
  12. /*    Note: keyboard interrupts are not trivial to handle, because interrupt
  13.     requests may well arrive even when Kevo is executing a completely
  14.     different task than the one to which the interrupt is targeted.
  15. */
  16. void doCancel()
  17. {
  18.     /* Ensure that possible trace mode will be terminated */
  19.     traceMode = QUITTRACE;
  20.     debugTask = NIL;
  21.  
  22.     /* yyy warning: reference to 'theTask' is non-portable */
  23.     /* 'theTask' designates the selected task in the user interface */
  24.  
  25.     if (up != theTask) {
  26.         /* The task to be cancelled is not the one which is currently executing */
  27.         if (theTask && isActivated(theTask)) {
  28.             /* Cancel the task in the current window if it is running */
  29.             TASK** tempUp = up;
  30.             int**  tempRp = returnSp;
  31.  
  32.             /* Set the keyboard task to execute the error vector */
  33.             /* Context and data stacks will NOT be emptied (yet). */
  34.             /* Higher-level code ('error') should initialize them. */
  35.                up = theTask;
  36.  
  37.             fprintf(confile, "== Cancel request received (interrupt pending)."); showTaskID();
  38.             ownPrintf("-- Cancel");
  39.  
  40.             returnSp = (*up)->rpStore;
  41.             topReturn = (int*)((*up)->errorVector->mfa);
  42.  
  43.                up = tempUp;
  44.                returnSp = tempRp;
  45.  
  46.                return;
  47.            }
  48.         else {
  49.             fprintf(confile, "== Current window has no active task which could be cancelled ==\n");     
  50.             return;
  51.         }
  52.       }
  53.     else {
  54.         /* Cancel the currently executing (and currently selected) task */
  55.         
  56.         /* Ensure that the menu hilighting will be off */
  57.         /* (must be done because this command can be invoked from the menu) */
  58.         HiliteMenu(FALSE);
  59.  
  60.         ownPrintf("-- Cancel");
  61.  
  62.           /* Return to inner interpreter (starting from 'error') */
  63.           execute((*up)->errorVector);
  64.           ownLongJmp();
  65.       }
  66. }
  67.  
  68.  
  69. /* initSignals(): set the handler for the most commonly occurring signals */
  70. /* Signal handling is not used in Mac */
  71. void initSignals()
  72.   signal(SIGINT, doCancel);
  73. /*
  74.   signal(SIGABRT, handler);
  75.   signal(SIGFPE,  handler);
  76.   signal(SIGILL,  handler);
  77.   signal(SIGINT,  handler);
  78.   signal(SIGSEGV, handler);
  79.   signal(SIGTERM, handler);
  80. */
  81. }
  82.  
  83.  
  84. /* threeBeeps()
  85.     Sound the bell three times to notify the user that something
  86.     serious has happened.
  87. */
  88. void threeBeeps()
  89. {
  90.     SysBeep(1);
  91.     SysBeep(1);
  92.     SysBeep(1);
  93. }
  94.  
  95.  
  96. /* reportIntegrityError():
  97.     This operation is included in all the places in the system 
  98.     in which system integrity checks are being performed.
  99. */
  100. void reportIntegrityError()
  101. {
  102.     threeBeeps();
  103.     if (!supervisor) {
  104.         ownPrintf("-- System integrity error detected (see console)");
  105.         execute((*up)->errorVector);
  106.     }
  107. }    
  108.  
  109.